package com.hwy.widget.material

import android.graphics.Paint
import android.os.Bundle
import android.view.ViewGroup
import android.widget.RelativeLayout
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.AppCompatTextView
import androidx.core.content.ContextCompat
import com.google.android.material.shape.*
import com.hwy.widget.R
import com.hwy.widget.utils.DisplayUtil

/**
 * Material 组件使用案例
 */
class MaterialActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_material)

        setMsgShape()

    }

    private fun setMsgShape() {
        // 三角形距离顶部圆角的偏移量
        val offsetTriangle = DisplayUtil.dpToPx(8).toFloat()
        // 三角形的边长
        val triangleSize = DisplayUtil.dpToPx(10).toFloat()

        setSendMsgShape(offsetTriangle, triangleSize)
        setReceiveMsgShape(offsetTriangle, triangleSize)
    }

    /**
     * 设置发送的消息背景
     */
    private fun setSendMsgShape(offsetTriangle: Float, triangleSize: Float) {
        findViewById<RelativeLayout>(R.id.rl_send_msg)?.run {
            val shapeModel = ShapeAppearanceModel.Builder()
                .setAllCorners(RoundedCornerTreatment())
                // 设置圆角大小
                .setAllCornerSizes(DisplayUtil.dpToPx(6).toFloat())
                // 设置消息箭头
                .setRightEdge(object : EdgeTreatment() {
                    override fun getEdgePath(
                        // 左侧 edge 减去上下两个圆角后剩下的长度
                        // 例如: totalLength = 100, 上下圆角的半径都为 10，此时 length=80
                        length: Float,
                        center: Float,
                        interpolation: Float,
                        shapePath: ShapePath
                    ) {
                        // 这里绘制左侧消息的箭头Path
                        // 注意：绘制任何一个 edge ，都可以认为此时canvas已经将 edge 通过中心旋转，将其转到了 top 位置
                        shapePath.lineTo(offsetTriangle, 0F)
                        shapePath.lineTo(offsetTriangle + triangleSize / 2f, -triangleSize)
                        shapePath.lineTo(offsetTriangle + triangleSize, 0F)
                        shapePath.lineTo(length, 0F)
                    }
                })
                .build()

            // 此时绘制的箭头会超出当前控件的范围，需要设置父布局不裁剪子布局
            (parent as? ViewGroup)?.clipChildren = false

            // 设置 Material 背景
            background = MaterialShapeDrawable(shapeModel).apply {
                // 设置颜色
                setTint(ContextCompat.getColor(context, R.color.purple_500))
                // 设置绘制填充
                paintStyle = Paint.Style.FILL
            }
        }

        findViewById<AppCompatTextView>(R.id.tv_send_msg)?.run {
            setOnClickListener {
                val msg = "${text}${text}"
                text = msg
            }
        }
    }

    /**
     * 设置接受的消息背景
     */
    private fun setReceiveMsgShape(offsetTriangle: Float, triangleSize: Float) {

        findViewById<RelativeLayout>(R.id.rl_receive_msg)?.run {
            val shapeModel = ShapeAppearanceModel.Builder()
                .setAllCorners(RoundedCornerTreatment())
                // 设置圆角大小
                .setAllCornerSizes(DisplayUtil.dpToPx(6).toFloat())
                // 设置消息箭头
                .setLeftEdge(object : EdgeTreatment() {
                    override fun getEdgePath(
                        // 左侧 edge 减去上下两个圆角后剩下的长度
                        // 例如: totalLength = 100, 上下圆角的半径都为 10，此时 length=80
                        length: Float,
                        center: Float,
                        interpolation: Float,
                        shapePath: ShapePath
                    ) {
                        // 这里绘制左侧消息的箭头Path
                        // 注意：绘制任何一个 edge ，都可以认为此时canvas已经将 edge 通过中心旋转，将其转到了 top 位置
                        shapePath.lineTo(length - offsetTriangle - triangleSize, 0F)
                        shapePath.lineTo(length - offsetTriangle - triangleSize / 2f, -triangleSize)
                        shapePath.lineTo(length - offsetTriangle, 0F)
                        shapePath.lineTo(length, 0F)
                    }
                })
                .build()

            // 此时绘制的箭头会超出当前控件的范围，需要设置父布局不裁剪子布局
            (parent as? ViewGroup)?.clipChildren = false

            // 设置 Material 背景
            background = MaterialShapeDrawable(shapeModel).apply {
                // 设置颜色
                setTint(ContextCompat.getColor(context, R.color.teal_200))
                // 设置绘制填充
                paintStyle = Paint.Style.FILL
            }
        }

        findViewById<AppCompatTextView>(R.id.tv_receive_msg)?.run {
            setOnClickListener {
                val msg = "${text}${text}"
                text = msg
            }
        }

    }

}